package org.acb.sgp.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.acb.sgp.beans.ImagenLocacion;
import org.acb.sgp.dao.ImagenLocacionDao;
import org.acb.sgp.factory.ConnectionFactory;

public class ImagenLocacionDaoImpl implements ImagenLocacionDao {

    private Connection con;
    private CallableStatement cs;
    private ResultSet rs;

    private Connection getConnection() throws SQLException {
        return ConnectionFactory.getInstance().getConnection();
    }

    @Override
    public void registrarImagen(ImagenLocacion imagen) {
        try {
            String sql = "{Call RegistrarImagenLocacion(?,?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setString(1, imagen.getNomImagen());
            cs.setInt(2, imagen.getLocacion().getCodLocacion());
            cs.registerOutParameter(3, Types.INTEGER);
            cs.execute();
            imagen.setCodImagen((Integer) cs.getObject(3));
        } catch (SQLException ex) {
            Logger.getLogger(ImagenLocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public void eliminarImagen(ImagenLocacion imagen) {
        try {
            String sql = "{Call EliminarImagenLocacion(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, imagen.getCodImagen());
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(ImagenLocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public void eliminarImagenesPorCodLocacion(Integer codLocacion) {
        try {
            String sql = "{Call EliminarImagenesPorCodLocacion(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codLocacion);
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(ImagenLocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public List<ImagenLocacion> listaImagenes() {
        List<ImagenLocacion> imagenes = new ArrayList<ImagenLocacion>();
        try {
            String sql = "{Call ListarImagenes()}";
            con = getConnection();
            cs = con.prepareCall(sql);
            rs = cs.executeQuery();
            while (rs.next()) {
                imagenes.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ImagenLocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return imagenes;
    }

    @Override
    public List<ImagenLocacion> listaImagenesPorCodLocacion(Integer codLocacion) {
        List<ImagenLocacion> imagenes = new ArrayList<ImagenLocacion>();
        try {
            String sql = "{Call ListarImagenesPorCodLocacion(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codLocacion);
            rs = cs.executeQuery();
            while (rs.next()) {
                imagenes.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ImagenLocacionDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return imagenes;
    }

    private ImagenLocacion llenar(ResultSet rs) throws SQLException {
        ImagenLocacion imagen = new ImagenLocacion();
        imagen.setCodImagen(rs.getInt("codImagen"));
        imagen.setNomImagen(rs.getString("nomImagen"));
        imagen.getLocacion().setCodLocacion(rs.getInt("codLocacion"));
        imagen.getLocacion().setNomLocacion(rs.getString("nomLocacion"));
        imagen.setFecRegistro(rs.getTimestamp("fecRegistro"));
        return imagen;
    }
}
